import pandas as pd
from common.handleExcel import save_to_newexcel_bytime, merge_same_column
from ui.SelectExcelFileSheet import SelectExcelFileSheet


def read_and_filter_data(file_path, sheet_name, columns_to_keep, filter_col=None, filter_value=None):
    """
    读取Excel数据并进行必要的列筛选和过滤
    :param file_path: Excel文件路径
    :param sheet_name: 要读取的Sheet名称
    :param columns_to_keep: 要保留的列列表
    :param filter_col: 需要过滤的列（可选）
    :param filter_value: 过滤值（可选）
    :return: 处理后的DataFrame
    """
    data = pd.read_excel(file_path, sheet_name)
    filtered_data = data[columns_to_keep]

    if filter_col and filter_value:
        filtered_data = filtered_data[filtered_data[filter_col].str.contains(filter_value, na=False)]

    return filtered_data


def process_area_data(data, area_column, sum_column, count_column, drop_duplicates=True):
    """
    根据给定的区域列（如实际管理区）进行分组，并计算总面积和总宗数
    :param data: 原始数据
    :param area_column: 区域列名（如 '实际管理区'）
    :param sum_column: 需要求和的列（如 '供应面积'）
    :param count_column: 需要统计计数的列（如 '土地用途'）
    :param drop_duplicates: 是否去重（默认为True）
    :return: 合并后的DataFrame
    """
    summed_data = data.groupby(area_column, as_index=False)[sum_column].sum()
    count_data = data.groupby(area_column).size().reset_index(name=count_column)

    merged_data = pd.merge(summed_data, count_data, on=area_column, how='left')

    if drop_duplicates:
        merged_data = merged_data.drop_duplicates(subset=area_column)

    return merged_data


def part22_process_data(selectExcelFileSheet: SelectExcelFileSheet):
    url4List, sheetName4List   = selectExcelFileSheet.showWindow('5.闲置台账表格逻辑关系--生成的--成果表1.清单')
    if url4List is None or sheetName4List is None:
        return

    # 读取并处理第一张表（成果表1.清单）
    cols_to_keep1 = ['设区市', '实际管理区']
    first_table = read_and_filter_data(url4List, sheetName4List, cols_to_keep1)

    # 获取供应面积和统计总宗数
    area_table = read_and_filter_data(url4List, sheetName4List, ['实际管理区', '供应面积'])
    merged_area = process_area_data(area_table, '实际管理区', '供应面积', '总宗数')

    # 合并第一张表和面积统计
    merged_table = pd.merge(first_table, merged_area, on='实际管理区', how='left').fillna(0)

    # 处理各类用地（房地产用地、政府平台公司用地等）
    second_table = read_and_filter_data(url4List, sheetName4List, ['土地用途', '供应面积', '实际管理区'], '土地用途', '商服用地|住宅用地')
    merged_second = process_area_data(second_table, '实际管理区', '供应面积', '房地产用地宗数')
    merged_second.rename(columns={'供应面积': '房地产用地面积'}, inplace=True)

    # 合并房地产用地信息
    merged_table = pd.merge(merged_table, merged_second[['实际管理区', '房地产用地面积', '房地产用地宗数']], on='实际管理区', how='left').fillna(0)

    # 处理疑似政府平台公司用地
    third_table = read_and_filter_data(url4List, sheetName4List, ['是否疑似政府平台公司用地', '供应面积', '实际管理区'], '是否疑似政府平台公司用地', '是')
    merged_third = process_area_data(third_table, '实际管理区', '供应面积', '疑似政府平台公司用地宗数')
    merged_third.rename(columns={'供应面积': '疑似政府平台公司用地面积'}, inplace=True)

    # 合并疑似政府平台公司用地信息
    merged_table = pd.merge(merged_table, merged_third[['实际管理区', '疑似政府平台公司用地面积', '疑似政府平台公司用地宗数']], on='实际管理区', how='left').fillna(0)

    # 处理基数内闲置土地类型
    fourth_table = read_and_filter_data(url4List, sheetName4List, ['闲置土地类型', '供应面积', '实际管理区'], '闲置土地类型', '基数内闲置土地')
    merged_fourth = process_area_data(fourth_table, '实际管理区', '供应面积', '基数内闲置土地宗数')
    merged_fourth.rename(columns={'供应面积': '基数内闲置土地类型用地面积'}, inplace=True)

    # 合并基数内闲置土地类型信息
    merged_table = pd.merge(merged_table, merged_fourth[['实际管理区', '基数内闲置土地类型用地面积', '基数内闲置土地宗数']], on='实际管理区', how='left').fillna(0)

    # 处理年内新增闲置土地类型
    fifth_table = read_and_filter_data(url4List, sheetName4List, ['闲置土地类型', '供应面积', '实际管理区'], '闲置土地类型', '年内新增闲置土地')
    merged_fifth = process_area_data(fifth_table, '实际管理区', '供应面积', '年内新增闲置土地宗数')
    merged_fifth.rename(columns={'供应面积': '年内新增闲置土地用地面积'}, inplace=True)

    # 合并年内新增闲置土地类型信息
    merged_table = pd.merge(merged_table, merged_fifth[['实际管理区', '年内新增闲置土地用地面积', '年内新增闲置土地宗数']], on='实际管理区', how='left').fillna(0)

    # 处理预计年内新增闲置土地类型
    sixth_table = read_and_filter_data(url4List, sheetName4List, ['闲置土地类型', '供应面积', '实际管理区'], '闲置土地类型', '预计年内新增闲置土地')
    merged_sixth = process_area_data(sixth_table, '实际管理区', '供应面积', '预计年内新增闲置土地宗数')
    merged_sixth.rename(columns={'供应面积': '预计年内新增闲置土地用地面积'}, inplace=True)

    # 合并预计年内新增闲置土地类型信息
    merged_table = pd.merge(merged_table, merged_sixth[['实际管理区', '预计年内新增闲置土地用地面积', '预计年内新增闲置土地宗数']], on='实际管理区', how='left').fillna(0)

    # 去除合并后的重复行
    merged_table = merged_table.drop_duplicates(subset=['设区市', '实际管理区'])

    # 计算各设区市的合计数据
    city_supply_area = merged_table.groupby('设区市').agg({
        '供应面积': 'sum',
        '房地产用地面积': 'sum',
        '房地产用地宗数': 'sum',
        '疑似政府平台公司用地面积': 'sum',
        '疑似政府平台公司用地宗数': 'sum',
        '基数内闲置土地类型用地面积': 'sum',
        '基数内闲置土地宗数': 'sum',
        '年内新增闲置土地用地面积': 'sum',
        '年内新增闲置土地宗数': 'sum',
        '预计年内新增闲置土地用地面积': 'sum',
        '预计年内新增闲置土地宗数': 'sum'
    }).reset_index().fillna(0)

    # 添加合计行
    city_supply_area['实际管理区'] = '小计'

    # 创建最终结果数据框
    final_results = []

    # 对每个设区市进行处理并添加合计
    for city in merged_table['设区市'].unique():
        city_data = merged_table[merged_table['设区市'] == city]
        city_stat = city_supply_area[city_supply_area['设区市'] == city]
        final_results.append(city_data)
        final_results.append(city_stat)

    final_df = pd.concat(final_results, ignore_index=True).fillna(0)

    # 计算全省合计并合并
    total_stat = pd.DataFrame(city_supply_area.sum(numeric_only=True)).T
    total_stat['设区市'] = '全省合计'
    total_stat['实际管理区'] = '全省合计'
    final_df = pd.concat([final_df, total_stat], ignore_index=True).fillna(0)

    # 保存结果到Excel文件
    output_excel_path, sheet_name = save_to_newexcel_bytime(final_df, prefixFileName='成果表2.全省剩余闲置(含预增)')
    merge_same_column(output_excel_path, sheet_name)

    return final_df
